from typing import Optional

from pydantic import BaseModel, Field

DEFAULT_TIME_RANGE = "00:00,24:00"


class EventsQueryParams(BaseModel):
    camera: Optional[str] = "all"
    cameras: Optional[str] = "all"
    label: Optional[str] = "all"
    labels: Optional[str] = "all"
    sub_label: Optional[str] = "all"
    sub_labels: Optional[str] = "all"
    zone: Optional[str] = "all"
    zones: Optional[str] = "all"
    limit: Optional[int] = 100
    after: Optional[float] = None
    before: Optional[float] = None
    time_range: Optional[str] = DEFAULT_TIME_RANGE
    has_clip: Optional[int] = None
    has_snapshot: Optional[int] = None
    in_progress: Optional[int] = None
    include_thumbnails: Optional[int] = Field(
        1,
        description=(
            "Deprecated. Thumbnail data is no longer included in the response. "
            "Use the /api/events/:event_id/thumbnail.:extension endpoint instead."
        ),
        deprecated=True,
    )
    favorites: Optional[int] = None
    min_score: Optional[float] = None
    max_score: Optional[float] = None
    min_speed: Optional[float] = None
    max_speed: Optional[float] = None
    recognized_license_plate: Optional[str] = "all"
    is_submitted: Optional[int] = None
    min_length: Optional[float] = None
    max_length: Optional[float] = None
    event_id: Optional[str] = None
    sort: Optional[str] = None
    timezone: Optional[str] = "utc"


class EventsSearchQueryParams(BaseModel):
    query: Optional[str] = None
    event_id: Optional[str] = None
    search_type: Optional[str] = "thumbnail"
    include_thumbnails: Optional[int] = Field(
        1,
        description=(
            "Deprecated. Thumbnail data is no longer included in the response. "
            "Use the /api/events/:event_id/thumbnail.:extension endpoint instead."
        ),
        deprecated=True,
    )
    limit: Optional[int] = 50
    cameras: Optional[str] = "all"
    labels: Optional[str] = "all"
    zones: Optional[str] = "all"
    after: Optional[float] = None
    before: Optional[float] = None
    time_range: Optional[str] = DEFAULT_TIME_RANGE
    has_clip: Optional[bool] = None
    has_snapshot: Optional[bool] = None
    is_submitted: Optional[bool] = None
    timezone: Optional[str] = "utc"
    min_score: Optional[float] = None
    max_score: Optional[float] = None
    min_speed: Optional[float] = None
    max_speed: Optional[float] = None
    recognized_license_plate: Optional[str] = "all"
    sort: Optional[str] = None


class EventsSummaryQueryParams(BaseModel):
    timezone: Optional[str] = "utc"
    has_clip: Optional[int] = None
    has_snapshot: Optional[int] = None
